home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / nops / SPARC.pm < prev   
Text File  |  2006-06-30  |  6KB  |  195 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Nop::SPARC;
  11. use strict;
  12. use base 'Msf::Nop';
  13. use Pex::Utils;
  14.  
  15. my $advanced = { };
  16. my $info = {
  17.     'Name'    => 'SPARC Nop Generator',
  18.     'Version' => '$Revision: 1.26 $',
  19.     'Authors' => [ 'vlad902 <vlad902 [at] gmail.com>', ],
  20.     'Arch'    => [ 'sparc' ],
  21.     'Desc'    =>  'SPARC nop generator',
  22.     'Refs'    => [ ],
  23. };
  24.  
  25.  
  26. sub new {
  27.     my $class = shift; 
  28.     return($class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_));
  29. }
  30.  
  31. my $table = [
  32.     [ \&InsSethi, [ ], ],                    # sethi
  33.     [ \&InsArithmetic, [ 0, 0 ], ],                # add
  34.     [ \&InsArithmetic, [ 0, 1 ], ],                # and
  35.     [ \&InsArithmetic, [ 0, 2 ], ],                # or
  36.     [ \&InsArithmetic, [ 0, 3 ], ],                # xor
  37.     [ \&InsArithmetic, [ 0, 4 ], ],                # sub
  38.     [ \&InsArithmetic, [ 0, 5 ], ],                # andn
  39.     [ \&InsArithmetic, [ 0, 6 ], ],                # orn
  40.     [ \&InsArithmetic, [ 0, 7 ], ],                # xnor
  41.     [ \&InsArithmetic, [ 0, 8 ], ],                # addx
  42.     [ \&InsArithmetic, [ 0, 12 ], ],            # subx
  43.     [ \&InsArithmetic, [ 0, 16 ], ],            # addcc
  44.     [ \&InsArithmetic, [ 0, 17 ], ],            # andcc
  45.     [ \&InsArithmetic, [ 0, 18 ], ],            # orcc
  46.     [ \&InsArithmetic, [ 0, 19 ], ],            # xorcc
  47.     [ \&InsArithmetic, [ 0, 20 ], ],            # subcc
  48.     [ \&InsArithmetic, [ 0, 21 ], ],            # andncc
  49.     [ \&InsArithmetic, [ 0, 22 ], ],            # orncc
  50.     [ \&InsArithmetic, [ 0, 23 ], ],            # xnorcc
  51.     [ \&InsArithmetic, [ 0, 24 ], ],            # addxcc
  52.     [ \&InsArithmetic, [ 0, 28 ], ],            # subxcc
  53.     [ \&InsArithmetic, [ 0, 32 ], ],            # taddcc
  54.     [ \&InsArithmetic, [ 0, 33 ], ],            # tsubcc
  55.     [ \&InsArithmetic, [ 0, 36 ], ],            # mulscc
  56.     [ \&InsArithmetic, [ 2, 37 ], ],            # sll
  57.     [ \&InsArithmetic, [ 2, 38 ], ],            # srl
  58.     [ \&InsArithmetic, [ 2, 39 ], ],            # sra
  59.     [ \&InsArithmetic, [ 4, 40 ], ],            # rdy
  60.     [ \&InsArithmetic, [ 3, 48 ], ],            # wry
  61.     [ \&InsBranch, [ 0 ] ],                    # bn[,a]
  62.     [ \&InsBranch, [ 1 ] ],                    # be[,a]
  63.     [ \&InsBranch, [ 2 ] ],                    # ble[,a]
  64.     [ \&InsBranch, [ 3 ] ],                    # bl[,a]
  65.     [ \&InsBranch, [ 4 ] ],                    # bleu[,a]
  66.     [ \&InsBranch, [ 5 ] ],                    # bcs[,a]
  67.     [ \&InsBranch, [ 6 ] ],                    # bneg[,a]
  68.     [ \&InsBranch, [ 7 ] ],                    # bvs[,a]
  69.     [ \&InsBranch, [ 8 ] ],                    # ba[,a]
  70.     [ \&InsBranch, [ 9 ] ],                    # bne[,a]
  71.     [ \&InsBranch, [ 10 ] ],                # bg[,a]
  72.     [ \&InsBranch, [ 11 ] ],                # bge[,a]
  73.     [ \&InsBranch, [ 12 ] ],                # bgu[,a]
  74.     [ \&InsBranch, [ 13 ] ],                # bcc[,a]
  75.     [ \&InsBranch, [ 14 ] ],                # bpos[,a]
  76.     [ \&InsBranch, [ 15 ] ],                # bvc[,a]
  77. # Removed for SPARCV7 support
  78. #    [ \&InsArithmetic, [ 0, 10 ], ],            # umul 
  79. #    [ \&InsArithmetic, [ 0, 11 ], ],            # smul 
  80. #    [ \&InsArithmetic, [ 1, 14 ], ],            # udiv
  81. #    [ \&InsArithmetic, [ 1, 15 ], ],            # sdiv
  82. #    [ \&InsArithmetic, [ 0, 26 ], ],            # umulcc
  83. #    [ \&InsArithmetic, [ 0, 27 ], ],            # smulcc
  84. #    [ \&InsArithmetic, [ 1, 30 ], ],            # udivcc
  85. #    [ \&InsArithmetic, [ 1, 31 ], ],            # sdivcc
  86. ];
  87.  
  88. # Returns valid destination register number between 0 and 31 excluding %sp and %fp
  89. sub get_dst_reg {
  90.     my $reg = int(rand(30));
  91.     $reg += ($reg >= 14);
  92.     $reg += ($reg >= 30);
  93.  
  94.     return $reg;
  95. }
  96.  
  97. # Any register.
  98. sub get_src_reg {
  99.     return int(rand(32));
  100. }
  101.  
  102. sub InsSethi {
  103.     return pack("N", ((get_dst_reg() << 25) | (4 << 22) | int(rand(1 << 22))));
  104. }
  105.  
  106. sub InsArithmetic {
  107.     my $ref = shift;
  108.     my $dst = get_dst_reg();
  109.     my $ver = $ref->[0];
  110.  
  111. # WRY fix-ups.
  112.     if($ver == 3)
  113.     {
  114.         $dst = 0;
  115.         $ver = 1; 
  116.     }
  117.  
  118. # 0, ~1, !2, ~3, !4
  119. # Use one src reg with a signed 13-bit immediate (non-0)
  120.     if(($ver == 0 && int(rand(2))) || $ver == 1)
  121.     {
  122.         return pack("N", ((2 << 30) | ($dst << 25) | ($ref->[1] << 19) | (get_src_reg() << 14) | (1 << 13) | (int(rand((1 << 13) - 1)) + 1)));
  123.     }
  124. # RDY
  125.     elsif($ver == 4)
  126.     {
  127. # $ref->[1] could be replaced with a static value since this only encodes for one function but it's done this way for consistancy.
  128.         return pack("N", ((2 << 30) | ($dst << 25) | ($ref->[1] << 19)));
  129.     }
  130. # Use two src regs
  131.     else
  132.     {
  133.         return pack("N", ((2 << 30) | ($dst << 25) | ($ref->[1] << 19) | (get_src_reg() << 14) | get_src_reg()));
  134.     }
  135. }
  136.  
  137. sub InsBranch {
  138.     my $ref = shift;
  139.     my $len = shift;
  140.  
  141. # We jump to 1 instruction before the payload so in cases where the delay slot of a branch with the the anull bit set that is not taken the first instruction of the
  142. #   payload is not anulled. 
  143.     $len = ($len / 4) - 1;
  144.  
  145.     return if(! $len);
  146.     $len = 0x3fffff if($len >= 0x400000);
  147.  
  148. #    return pack("N", ((int(rand(2)) << 29) | ($ref->[0] << 25) | (2 << 22) | $len)); 
  149.     return pack("N", ((int(rand(2)) << 29) | ($ref->[0] << 25) | (2 << 22) | int(rand($len - 1)) + 1)); 
  150. }
  151.  
  152. sub Nops {
  153.     my $self = shift;
  154.     my $length = shift;
  155.     my $backup_length = $length;
  156.  
  157.     my $exploit = $self->GetVar('_Exploit');
  158.     my $random  = $self->GetVar('RandomNops');
  159.     my $badChars = $exploit->PayloadBadChars;
  160.     my ($nop, $tempnop, $count, $rand);
  161.  
  162.     if(! $random)
  163.     {
  164.         $length = 4;
  165.     }
  166.  
  167.     for($count = 0; length($nop) < $length; $count++)
  168.     {
  169.         $rand = int(rand(scalar(@{$table})));
  170.  
  171.         $tempnop = $table->[$rand]->[0]($table->[$rand]->[1], $length - length($nop));
  172.  
  173.         if(!Pex::Utils::ArrayContains([split('', $tempnop)], [split('', $badChars)]))
  174.         {
  175.             $nop .= $tempnop;
  176.             $count = 0;
  177.         }
  178.  
  179.         if($count > $length + 10000)
  180.         {
  181.             $self->PrintDebugLine(3, "Iterated $count times with no nop match.");
  182.             return;
  183.         }
  184.     }
  185.  
  186.     if(! $random)
  187.     {
  188.         $nop = $nop x ($backup_length / 4);
  189.     }
  190.  
  191.     return $nop;
  192. }
  193.  
  194. 1;
  195.